package com.kx.controller;

import com.kx.vo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
public class MyController {

    @RequestMapping(value = "/first.do")
    public ModelAndView doFirst(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "欢迎使用" + request.getParameter("name"));
        mv.addObject("fun", "执行的是Other方法");
        mv.setViewName("other");
        return mv;
    }

    /**
     * 逐个接收请求参数
     * 要求控制器方法的形参名和请求中的参数名一致
     * 框架接收请求参数
     * 1、使用request对象接受请求参数
     * String strName=request.getParameter("name");
     * String strPassword=request.getParameter("password");
     * <p>
     * 2、springmvc框架DispatcherServlet 调用MyController的doSome()方法
     * 调用方法时，按名称对应，把接收的参数赋给形参
     * doSome(strName,Integer.valueOf(strPassword));
     * 框架会提供类型自动转换功能
     * <p>
     * 400状态码错误：是客户端错误，表示提交请求参数过程中，发生了问题
     * 例：前端form中age未填写，传给后端框架自动转换int类型转换报400，把后端doSome形参int age改为Integer age
     * 但像double等类型输入后端转换依旧报400
     */
    @RequestMapping(value = "/receive.do")
    public ModelAndView doSome(String name, Integer age) {  //doGet --service请求处理
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", name);
        mv.addObject("age", age);
        mv.setViewName("show");
        return mv;
    }

//    public void doGet(HttpServletRequest request) throws UnsupportedEncodingException {
//        request.setCharacterEncoding("utf-8");
//    }
//
//    public void doPost(HttpServletRequest request) throws UnsupportedEncodingException {
//        request.setCharacterEncoding("utf-8");
//    }

    /**
     * 请求中参数名和处理器方法的形参名不一样
     * @RequestParam：逐个参数请求中，解决请求中参数名形参名不一样的问题
     *      属性：1、value请求中的参数名称
     *           2、requered是一个boolean，默认是true
     *                  true：表示请求中必须包含此参数，否则报400
     *      位置：在处理器方法的形参定义的前面
     *
     * 注：占位符的形式，那么可以使用注解@pathvariable取出。
     */
    @RequestMapping(value = "/receiveparam.do")
    public ModelAndView receiveParam(@RequestParam(value = "ename") String name, @RequestParam(value = "eage",required = false) Integer age) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", name);
        mv.addObject("age", age);
        mv.setViewName("show");
        return mv;
    }

    /**
     * 处理器方法形参是java对象，这个对象的属性名和请求参数名一致
     * 框架会创建形参的java对象，给属性赋值，请求中的参数是name，框架会调用setName()
     */
    @RequestMapping(value = "/receiveobject.do")
    public ModelAndView receiveObject(Student student) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", student.getName());
        mv.addObject("age", student.getAge());
        mv.setViewName("show");
        return mv;
    }
}
